package ssn.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.util.Scanner;

import javax.activation.MimetypesFileTypeMap;

import egovframework.rte.fdl.string.EgovDateUtil;
import egovframework.rte.fdl.string.EgovStringUtil;

public class FileUtil {

	
	/**
	 * 파일이동 
	 */
	public static String moveFiles(String savePath, String movePath, String fileName) {

		movePath = movePath + dayFolder();

		File destDir = new File(movePath);
		if (!destDir.exists() || !destDir.isDirectory()) {
			destDir.mkdirs(); // 디렉토리 생성
		}

		//String newFileName = getUniqueNumbering(movePath, fileName);
		File orgDir = new File(savePath + File.separator + fileName);

		if (orgDir.exists()) {
			orgDir.renameTo(new File(movePath + File.separator + fileName)); // 파일명 및
		}
		return dayFolder()+File.separator+fileName;

	}

	/**
	 * 년월일폴더
	 */
	public static String dayFolder(){
		return dayFolder(true);
	}
	public static String dayFolder(boolean tf) {
		String Year = EgovDateUtil.getCurrentYearAsString();
		String Month = EgovDateUtil.getCurrentMonthAsString();
		String Day = EgovDateUtil.getCurrentDayAsString();
		String dayFolder="";
		if (tf){
			dayFolder = File.separator + Year + "." + Month + File.separator + Day;
		}else{
			dayFolder = "/" + Year + "." + Month + "/" + Day;
		}
		return dayFolder;
	}
	
	/**
	 * 파일명 변경(중복파일명) 
	 */
	public static String getUniqueNumbering(String folder, String filename) {
		String file_name, file_ext, newfilename;
		int pos;

		pos = filename.lastIndexOf(".");

		if (pos == -1) {
			file_name = filename;
			file_ext = "";
		} else {
			file_name = filename.substring(0, pos);
			file_ext = filename.substring(pos);
		}

		newfilename = file_name + file_ext;

		if (new File(folder + File.separator + newfilename).exists()) {
			for (int i = 0; i < 100; i++) {
				newfilename = file_name + "(" + i + ")" + file_ext;

				if (!new File(folder + File.separator + newfilename).exists()) {
					break;
				}
			}
		}

		return newfilename;
	}

	/**
	 * file mimeType
	 */
	public static String getMimeType(String fileName) throws Exception {
		String mimeType = "";
		String fileExt = getExtension(fileName).toLowerCase();
		if (EgovStringUtil.equals(fileExt, "wmv")
				|| EgovStringUtil.equals(fileExt, "wma")) {
			mimeType = "video/" + fileExt;
		} else if (EgovStringUtil.equals(fileExt, "xls")
				|| EgovStringUtil.equals(fileExt, "xlsx")) {
			mimeType = "application/excel";
		} else if (EgovStringUtil.equals(fileExt, "doc")
				|| EgovStringUtil.equals(fileExt, "docx")) {
			mimeType = "application/msword";
		} else if (EgovStringUtil.equals(fileExt, "pdf")) {
			mimeType = "application/pdf";
		} else if (EgovStringUtil.equals(fileExt, "bmp")) {
			mimeType = "image/" + fileExt;
		} else {
			MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
			mimeType = mimeTypesMap.getContentType(fileName);
		}
		return mimeType;
	}
	
	/**
	 * file mimeType
	 */
	public static String getFileType(String fileName) throws Exception {
		String fileType = "";
		String fileExt = getExtension(fileName).toLowerCase();
		if (EgovStringUtil.equals(fileExt, "hwp")) {
			fileType = "hwp";
		} else if (EgovStringUtil.equals(fileExt, "xls") || EgovStringUtil.equals(fileExt, "xlsx")) {
			fileType = "excel";
		} else if (EgovStringUtil.equals(fileExt, "doc") || EgovStringUtil.equals(fileExt, "docx")) {
			fileType = "word";
		} else if (EgovStringUtil.equals(fileExt, "pdf")) {
			fileType = "pdf";
		} else if (EgovStringUtil.equals(fileExt, "ppt")) {
			fileType = "ppt";
		} else {
			fileType = fileExt;
		}
		return fileType;
	}

	/**
	 * 파일확장자
	 */
	public static String getExtension(String fileName) {
		return fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
	}
	
	/**
	 * 파일명(확장자 제외)
	 */
	public static String getFileTitle(String fileName) {
		return fileName.substring(0, fileName.lastIndexOf("."));
	}

	/**
	 * 파일삭제
	 * @param filePath 파일물리경로
	 * @param fileName 파일명
	 */
	public static boolean deleteFile(String fileFullPath) throws Exception {
		boolean result = false;
		// 파일 삭제
		File file = new File(fileFullPath);
		if (file.isFile()) {
			result = file.delete();
		}
		return result;
	}
	
	/**
	 * 파일삭제
	 * @param filePath 파일물리경로
	 * @param fileName 파일명
	 */
	public static boolean deleteFile(String filePath, String fileName) throws Exception {
		String fileInfo = filePath + File.separator + fileName;
		return deleteFile(fileInfo);
	}

	
	/**
	 * 원본파일복사
	 */
	public static void oriFileCopy(String oriFilePath, String oriFileName,
			String copyFilePath, String copyFileName) throws Exception {

		// 원본 파일정보
		String oriFileInfo = oriFilePath + File.separator + oriFileName;
		// 복사 파일정보
		String copyFileInfo = copyFilePath + File.separator + copyFileName;

		// 복사 디렉토리 생성
		File copyFileDirTemp = new File(copyFilePath);
		if (!copyFileDirTemp.isDirectory()) {
			copyFileDirTemp.mkdirs();
		}
		// 파일복사
		File oriFile = new File(oriFileInfo);
		File copyFile = new File(copyFileInfo);

		fileCopyByChannel(oriFile, copyFile);
	}

	/**
	 * 파일복사 (Channel 사용)
	 *
	 * @param inFile 원본 파일
	 * @param outFile 복사 파일
	 * @return long 파일 사이즈(byte)
	 */
	public static long fileCopyByChannel(File inFile, File outFile)
			throws Exception {

		// 파일 채널 변수
		FileChannel fileInChannel = null;
		FileChannel fileOutChannel = null;
		long byteSize = 0;
		try {
			// 채널생성
			fileInChannel = new FileInputStream(inFile).getChannel();
			fileOutChannel = new FileOutputStream(outFile).getChannel();
			// 파일 복사
			long fileSize = fileInChannel.size();
			byteSize = fileInChannel.transferTo(0, fileSize, fileOutChannel);
		} catch (Exception e) {
			throw e;
		} finally {
			try {
				fileOutChannel.close();
			} catch (Exception e) {
			}
			try {
				fileInChannel.close();
			} catch (Exception e) {
			}
		}
		return byteSize;
	}

	
	/**
	 * 파일복사
	 * @param oriPath  - 원본 경로
	 * @param copyPath - 복사 경로
	 * @param fileName - 파일명
	 * @throws Exception
	 */
	public static void copyFile(String oriPath, String copyPath, String fileName) throws Exception {

		File destDir = new File(copyPath);

		if (!destDir.exists() || !destDir.isDirectory()) {
			destDir.mkdirs(); // 디렉토리 생성
		}

		String oriFileInfo = oriPath + File.separator + fileName;
		String copyFileInfo = copyPath + File.separator + fileName;

		// 파일복사
		File oriFile = new File(oriFileInfo);
		File copyFile = new File(copyFileInfo);

		fileCopyByChannel(oriFile, copyFile);

	}

	/**
	 * 임시 저장 파일 삭제(temp)
	 * @param param - Map (fileName : 임시파일명)
	 * @return int
	 * @throws Exception
	 */
	public static boolean deleteTempFile(String fileName, String filePath) throws Exception {

		boolean result = false;

		try {
			// 파일정보
			String fileInfo = filePath + File.separator + fileName;
			// 파일 삭제
			File file = new File(fileInfo);
			if (file.isFile()) {
				file.delete();
			}
    		result = true;	//성공
		} catch (Exception e) {
			//log.debug(e.getMessage());
			result = false;	//실패
		}
    	return result;
	}

	/**
	 * 파일이동
	 * @param oriFile  - 원본파일
	 * @param destFile - 대상파일
	 * @throws Exception
	 */
	public static void moveFile(File oriFile, File destFile) throws Exception {
		fileCopyByChannel(oriFile, destFile);
		oriFile.delete();
	}
	
	/**
	 * 텍스트 파일읽기
	 * @param filePath 파일물리경로
	 * @param fileName 파일명
	 * @return String
	 * @throws Exception
	 */
	public static String scannerFile(String filePath, String fileName) throws Exception {
		
		// 파일정보
		String fileInfo = filePath + File.separator + fileName;

		File file = new File(fileInfo);
		String result = "";
		StringBuffer bufferStr = new StringBuffer();
				
		if(file.isFile()){
			Scanner scanner = new Scanner(file);
			while(scanner.hasNextLine()){
				result = (String)scanner.nextLine();
				bufferStr.append(result);
			}
			result =  bufferStr.toString();
		}
		
		return result;
	}
}
